package designmodeltest;


import java.util.Objects;

/**
 * @Classname ConstructorArg
 * @Description 在下面的 ConstructorArg 类中，
 * 当 isRef 为 true 的时候，arg 表示 String 类型的 refBeanId，type 不需要设置；
 * 当 isRef 为 false 的时候，arg、type 都需要设置。请根据这个需求，完善 ConstructorArg 类
 * @Date 2020/2/17 6:48 下午
 * @Created by gule
 */
public class ConstructorArg {
    private boolean isRef;
    private Class type;
    private Object arg;

    private  ConstructorArg(Builder builder){
        this.arg = builder.arg;
        this.type = builder.type;
        this.isRef = builder.isRef;
    }

    public static class Builder{

        private boolean isRef;
        private Class type;
        private Object arg;

        public ConstructorArg build() throws Exception {
            if(isRef){
                if(!type.equals(String.class)){
                    throw new Exception("当 isRef 为 true 的时候，arg 表示 String 类型的 refBeanId，type 不需要设置");
                }
            }else if(!isRef){
                if(Objects.isNull(arg) || Objects.isNull(type)){
                    throw new Exception("当 isRef 为 false 的时候，arg、type 都需要设置。");
                }
            }
            return new ConstructorArg(this);
        }

        public Builder setIsRef(boolean isRef){
            this.isRef = isRef;
            return this;
        }
        public Builder setArg(Object isRef){
            this.arg = isRef;
            return this;
        }
        public Builder setType(Class isRef){
            this.type = isRef;
            return this;
        }
    }
}
